// watcher是观察者，也可以理解使用数据的对象，vue中使用数据的对象就是html中的各种节点，因此要在处理节点的地方实例化watcher
// watcher要实现的功能就是让节点的update和节点使用的数据关联起来
class Watcher {
  constructor(vm, key, cb) {
    this.vm = vm
    this.key = key
    this.cb = cb
    // 实例化watcher对象时，把当前watcher对象添加到Dep类的静态属性target上
    Dep.target = this
    // 由于vm[key]会出发key对应的getter方法，这样当前watcher就被添加到了当前key的依赖对象dep的subs中。
    this.oldValue = vm[key]
    Dep.target = null
  }

  update() {
    const newValue = this.vm[this.key]
    if(newValue === this.oldValue) return
    this.cb(newValue)
  }
}